/**
 * Clase que almacena informacion
 * 
 * @author HPCIII_Team2013
 */

package cl.ucn.hpc.almacenamiento;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.io.Serializable;
import java.util.List;

public class Storage implements Serializable {
	//Creado automaticamente por java para clases serializables
	private static final long serialVersionUID = -8940280640784863596L;
	
	//Directorio donde almacenara los datos 
	private final String filepath;

    /**
     * Constructor de la clase
     * 
     * @param String _filepath Directorio donde debe almacenar los datos
     */
	public Storage(final String _filepath) {
		this.filepath = _filepath;
	}


    /**
     * Guarda el texto recibido.
     * 
     * @param text Texto a almacenar.
     * @param nombre Nombre del archivo donde se guardara.
     * @return archivo creado.
     * @throws IOException Si no puede crear el FileOutputStream.
     */

	public synchronized File save(final String text, final String nombre) throws IOException {
		PrintStream out = null;
		try {
			out = new PrintStream(new FileOutputStream((filepath + File.separatorChar + nombre),true));
			out.append(text);
		} finally {
			if (out != null)
				out.close();
		}

		File f = new File(filepath + File.separatorChar + nombre);

		if (f != null && f.exists()) {
			return f;
		}
		return null;

	}

    /**
     * Guarda la pagina recibida (con texto HTML).
     * 
     * @param is Pagina a almacenar.
     * @param nombre Nombre del archivo donde se guardara.
     * @return archivo creado.
     * @throws IOException Si no puede crear el FileOutputStream.
     */	
	public synchronized File save(final InputStream is, final String nombre) throws IOException {
		FileOutputStream fos = new FileOutputStream(filepath + File.separatorChar + nombre,true);
		byte[] array = new byte[1000];
		int leido = is.read(array);
		
		while (leido > 0) {
			fos.write(array, 0, leido);
			leido = is.read(array);
		}

		is.close();
		fos.close();

		File f = new File(filepath + File.separatorChar + nombre);
		
		if (f.exists()) {
			return f;
		}

		return null;
	}

    /**
     * Guarda los enlaces recibidos.
     * 
     * @param is Pagina a almacenar.
     * @param nombre Nombre del archivo donde se guardara.
     * @return archivo creado.
     * @throws IOException Si no puede crear el FileOutputStream.
     */
	public synchronized File save(List<String> images, String name) throws IOException {		
		if(images != null){
			for(String texto: images){
				save((texto+"\r\n"),name);
			}
		}
		File f = new File(filepath + File.separatorChar + name);

		if (f != null && f.exists()) {
			return f;
		}	
				
		return null;
	}
	
    /**
     * Retorna el directorio en el cual se almacenan los archivos
     *
     * @return directorio
     */
	public String getFilePath(){
		return this.filepath;
	}
}
